// 1. 初始化axios实例
// 2. 请求拦截器 带token
// 3. 响应拦截器， 拿出响应数据、当遇到401 拦截token失效
// 4. 定义函数来使用axios发请求
// 5. 得到请求工具函数
import axios from 'axios'
import store from '@/store'
import router from '@/router'

const instance = axios.create({
  // 基础地址
  baseURL: 'http://pcapi-xiaotuxian-front.itheima.net/',
  // 网络超时
  timeout: 5000
})

// 添加请求拦截器
instance.interceptors.request.use(function (config) {
  /**
   * config 请求配置
   * 1.获取token
   * 2.请求头设置token
   */
  const { token } = store.state.user.profile
  if (token) config.headers.Authorization = `Bearer ${token}`
  // 在发送请求之前做些什么
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
instance.interceptors.response.use(function (response) {
  /**
    * response 响应数据对象
    *
    */
  // 对响应数据做点什么
  return response.data
}, function (error) {
  // 对响应错误做点什么
  // 当token为传 已失效，响应码 401
  if (error.response && error.status === 401) {
    // 跳回登录页（携带当前的路由地址 --- 完整地址 哈希地址+传参） 登录成功后跳回
    // 拿到当前的路由信息对象  router.currentRout
    // 跳转前需要对地址进行url编码
    // 使用router.currentRoute的时候加上value（vue3）
    const redirectUrl = encodeURIComponent(router.currentRoute.value.fullPath)
    router.push({ path: '/login', query: { redirectUrl } })
  }
  return Promise.reject(error)
})

export default (url, method, submitData) => {
  /**
   * url  - 请求地址
   * method 请求方式
   * submitData 对象 提交数据
   */
  // 使用配置好的axios发请求
  // 返回axios的调用
  return instance({
    url,
    method,
    // params get方式传参  data 其他方式
    // 动态插入的语法
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}
